package jmine.tec.utils.mail;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Message.RecipientType;
import javax.mail.internet.MimeMessage;

import org.apache.log4j.Logger;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;

/**
 * Classe mock para envio de email.
 * 
 * @author Cesar Olmos
 */
public class MockMailSender implements JavaMailSender {

    /**
     * Cria uma mensagem.
     * 
     * @return uma mensagem.
     */
    public MimeMessage createMimeMessage() {
        return new MimeMessage(Session.getDefaultInstance(new Properties()));
    }

    /**
     * Cria uma mensagem.
     * 
     * @param contentStream ignorado.
     * @return uma mensagem.
     */
    public MimeMessage createMimeMessage(InputStream contentStream) {
        return this.createMimeMessage();
    }

    /**
     * Apenas imprime o conteúdo da mensagem através do Log4J.
     * 
     * @param mimeMessage a mensagem.
     */
    public void send(MimeMessage mimeMessage) {
        StringBuilder sb = new StringBuilder();
        sb.append("Mail\n");
        try {
            sb.append("\tfrom:    " + mimeMessage.getFrom());
            sb.append("\tto:      " + mimeMessage.getRecipients(RecipientType.TO));
            sb.append("\tsubject: " + mimeMessage.getSubject());
            sb.append("\tcontent: " + mimeMessage.getContent());
        } catch (MessagingException e) {
            Logger.getLogger(this.getClass()).debug("Erro enviando email através de classe mock.", e);
        } catch (IOException e) {
            Logger.getLogger(this.getClass()).debug("Erro enviando email através de classe mock.", e);
        }
        Logger.getLogger(this.getClass()).debug(sb.toString());
    }

    /**
     * Apenas imprime o conteúdo das mensagem através do Log4J.
     * 
     * @param mimeMessages as mensagens.
     */
    public void send(MimeMessage[] mimeMessages) {
        for (MimeMessage msg : mimeMessages) {
            this.send(msg);
        }
    }

    /**
     * Não faz nada.
     * 
     * @param mimeMessagePreparator ignorado.
     */
    public void send(MimeMessagePreparator mimeMessagePreparator) {
        // does nothing
    }

    /**
     * Não faz nada.
     * 
     * @param mimeMessagePreparators ignorado.
     */
    public void send(MimeMessagePreparator[] mimeMessagePreparators) {
        // does nothing
    }

    /**
     * Apenas imprime o conteúdo da mensagem através do Log4J.
     * 
     * @param simpleMessage a mensagem.
     */
    public void send(SimpleMailMessage simpleMessage) {
        StringBuilder sb = new StringBuilder();
        sb.append("Mail\n");
        sb.append("\tfrom:    " + simpleMessage.getFrom());
        sb.append("\tto:      " + simpleMessage.getTo());
        sb.append("\tsubject: " + simpleMessage.getSubject());
        sb.append("\tcontent: " + simpleMessage.getText());
        Logger.getLogger(this.getClass()).debug(sb.toString());
    }

    /**
     * Apenas imprime o conteúdo das mensagem através do Log4J.
     * 
     * @param simpleMessages as mensagens.
     */
    public void send(SimpleMailMessage[] simpleMessages) {
        for (SimpleMailMessage msg : simpleMessages) {
            this.send(msg);
        }
    }

}
